package com.diy.common.helper;

import org.springframework.beans.BeanUtils;
import java.util.*;

/**
 * 集合调整类
 */
public class ConvertUtil {

    public static <T> void toDistinct(Collection<T> t) {
        if (CollectionUtil.isEmpty(t))
            return;
        HashSet<T> hashSet = new HashSet<T>(t);
        t.clear();
        t.addAll(hashSet);
    }

    /**
     * @Description:将List转换为指定Key的Map集合
     * @author:honglei.yang
     * @Date: 2015年9月14日 下午12:59:22
     * @Version: V
     */
    public static <T,R> Map<R, T> toDic(Collection<T> t, convertHandler<T, R> c) {
        Map<R, T> map=new HashMap<R, T>();
        if (CollectionUtil.isNotEmpty(t)) {
            for (T item : t) {
                R rValue = c.to(item);
                if (rValue != null)
                    map.put(c.to(item), item);
            }
        }
        return map;
    }

    /**
     * List转换List应用
     * @param t 数据源类型
     * @param c 实现转换方法
     * @param <T> 转换
     * @param <R>
     * @return
     */
    public static <T,R> List<R> toSelect(Collection<T> t, convertHandler<T, R> c) {
        List<R> list=new ArrayList<R>();
        if (CollectionUtil.isNotEmpty(t)) {
            for (T item : t) {
                R convertItem = c.to(item);
                if (convertItem == null)
                    continue;
                list.add(convertItem);
            }
        }

        toDistinct(list);
        return list;
    }

    public static <T,R> void toSelect(Collection<T> t, convertHandler<T, R> c, Collection<R> list) {

        if (CollectionUtil.isNotEmpty(t)) {
            for (T item : t) {
                R convertItem = c.to(item);
                if (convertItem == null)
                    continue;
                list.add(convertItem);
            }
        }
        toDistinct(list);
    }


    public static <T,R> List<R> toCopyProperties(Collection<T> source, Class<R> convertClass) {
        try {
            List<R> convertList=new ArrayList<>();
            for (T item:source){
                R r= convertClass.newInstance();
                BeanUtils.copyProperties(item, r);
                convertList.add(r);
            }
            return convertList;
        }
        catch (Exception e){
            return null;
        }
    }

    private    interface convertHandler<T,R>{
        R to(T arg);
    }
}
